import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import animation
"""
    plot：线状图
    scatter: 散点图

"""
"""直线
"""
def lession_1():
    # 随机一维数据组
    x = np.linspace(-1, 1, 50)

    # 得到y的数值
    y = x * 2 + 1

    plt.figure()
    plt.plot(x, y)
    plt.show()


""" 图像的长宽设置
"""
def lession_2():
    """num: 图像的编号
       figsize： 项目的长宽比
    """
    plt.figure(num=3, figsize=(8, 5),)
    x = np.linspace(-1, 1, 50)
    y1 = x * 2 + 1
    y2 = x ** 2

    plt.plot(x, y2)
    plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--')
    plt.show()


"""
    plt.xlim设置x坐标轴范围：(-1, 2)； 使用plt.ylim设置y坐标轴范围：(-2, 3)； 使用plt.xlabel设置x坐标轴名称：’I am x’； 使用plt.ylabel设置y坐标轴名称：’I am y’；

"""
def lession_3():
    x = np.linspace(-1, 1, 50)
    y1 = x * 2 + 1

    plt.figure(figsize=[5, 5])
    plt.plot(x, y1, color="red", linewidth=1.0, linestyle="--")

    #设置原地X,Y坐标
    plt.ylim(-1)
    plt.xlim(-1)

    #Y轴的刻度名称设置
    plt.yticks([-2, -1.8, -1, 1.22, 3], [r'$really\ bad$', r'$bad$', r'$normal$', r'$good$', r'$really\ good$'])

    #X、Y轴名称
    plt.ylabel("Y轴名称")
    plt.xlabel("X轴名称")
    plt.show()

"""
    scatter ： 打印点信息
    annotate： 注释
"""
def lession_4():
    x = np.linspace(-1, 3, 50)
    y1 = x * 2 + 1
    plt.figure(figsize=[10, 10])
    x0 = 1
    y0 = 2*x0 + 1
    plt.xlim([0, 10])
    plt.ylim([0, 10])
    plt.plot(x, y1)
    plt.plot([x0, x0], [0, y0], 'k--', linewidth=2.5)

    # 打印点信息
    plt.scatter([x0, ], [y0, ], s=50, color='b')

    # 图片注释
    plt.annotate(r'$2x+1=%s$' % y0, xy=(x0, y0), xycoords='data', xytext=(+30, -30),
                 textcoords='offset points', fontsize=16,
                 arrowprops=dict(arrowstyle='->', connectionstyle="arc3,rad=.2"))

    plt.show()


"""

    np.arange: 生成n个range生成的数组
    bar: 画树状图
    plt.text 为目标(x,y)增加注释文本

"""
def lession_5():
    plt.figure()
    x = [2017 + i for i in range(0, 10) if i % 2 != 0]
    x2 = [2017 + i for i in range(0, 10) if i % 2 == 0]
    y = np.random.uniform(0.1, 1.0, len(x))
    plt.bar(x, y, facecolor='#9999ff', edgecolor='white')
    plt.bar(x2, y)

    #为柱状图加注释，通过点坐标。
    for x, y in zip(x, y):
        plt.text(x + 0.4, y + 0.05, '%.2f' % y, ha='center', va='bottom')
    plt.show()


def lession_6():
    fig = plt.figure()
    ax = Axes3D(fig)

    # X, Y value
    X = np.arange(-4, 4, 0.25)
    Y = np.arange(-4, 4, 0.25)
    X, Y = np.meshgrid(X, Y)    # x-y 平面的网格
    print(X)

    print()
    print()

    print(Y)

    R = np.sqrt(X ** 2 + Y ** 2)

    # height value
    Z = np.sin(R)
    ax.plot_surface(X, Y, Z, rstride= 1, cstride= 1, cmap= plt.get_cmap('rainbow'))
    plt.show()



def init(line,x):
    line.set_ydata(np.sin(x))
    return line,

def animate(i ,line,x):
    line.set_ydata(np.sin(x + i/10.0))
    return line,

"""
    动画显示
"""
def animate():

    fig, ax = plt.subplots()
    x = np.arange(0, 2*np.pi, 0.01)
    line, = ax.plot(x, np.sin(x))


    ani = animation.FuncAnimation(fig=fig,
                                  func=lambda i: animate(i, line, x),
                                  frames=100,
                                  init_func=lambda : init(line, x), #无参数
                                  interval=20,
                                  blit=False)
    plt.show()
    ani.save('basic_animation.mp4', fps=30, extra_args=['-vcodec', 'libx264'])


if __name__ == "__main__":
    animate()